//
// Created by xy on 2024/10/23.
//
#include "public.h"
// 切割传输参数
// 返回用户名      agv[0]
// 当前工作路径    agv[1]
// 命令参数        agv[2]
int getToken(char *protocol,char **agv)
{    // 分割&
    agv[0] = strtok(protocol,"&");
    agv[1] = strtok(NULL,"&");
    agv[2] = strtok(NULL,"&");

    // 分割=
    for(int i = 0;i < 3;i++)
        for(char *p = agv[i];*p != '\0';p++)
            if(*p == '=')
                agv[i] = p + 1;

    // 清理路径前面的/
    char *p = agv[1];
    while(*p == '/')
        p++;
    agv[1] = p;
    // 清理参数前面的/
    p = agv[2];
    while(*p == '/')
        p++;
    agv[2] = p;
    // 清理参数前面的./
    p = agv[2];
    if(*p == '.' && p[1] == '/')
        agv[2] = p + 2;

    return 0;
}


// 生成随机盐值的函数
void generate_random_salt(char *salt) {
    srand(time(NULL));
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for (int i = 0; i < SALT_LENGTH - 1; i++) {
        salt[i] = charset[rand() % (sizeof(charset) - 1)];
    }

}


// 哈希密码和盐值的函数
void hash_password_with_salt(const char *password, const char *salt, char *hash) {
    char combined[256]; // 存储组合的密码和盐
    sprintf(combined, "%s%s", password, salt); // 合并密码和盐
    unsigned char digest[SHA256_DIGEST_LENGTH]; // 存储哈希结果
    SHA256((unsigned char *)combined, strlen(combined), digest); // 计算哈希

    // 转换哈希结果为十六进制字符串
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        sprintf(&hash[i * 2], "%02x", digest[i]);
    }
    hash[SHA256_DIGEST_LENGTH * 2] = '\0'; // 确保字符串以 NULL 结尾

}

//SHA256哈希文件
void hash_file(int file_fd ,char* hashed_file)
{

    EVP_MD_CTX *ctx=EVP_MD_CTX_create();
    EVP_DigestInit_ex(ctx,EVP_sha256(),NULL);
    size_t read_size ;
    unsigned char buf[4096];
    while((read_size = read(file_fd,buf,sizeof(buf)))>0)
    {
        EVP_DigestUpdate(ctx,buf,read_size);
    }
    unsigned char hash[SHA256_DIGEST_LENGTH];
    
    EVP_DigestFinal(ctx,hash,NULL);
    for(int i=0;i<SHA256_DIGEST_LENGTH;i++)
    {
        sprintf(&hashed_file[2*i],"%02x",hash[i]);
    }
    EVP_MD_CTX_destroy(ctx);
}
